parser grammar parserFLEX;

options {
  language = Java;
  tokenVocab = lexerFLEX;
}

@header {
package PL.p5;
}

@rulecatch {catch (RecognitionException e) {
  throw e;}
 }

entrada: def_token def_variables def_reglas funcion EOF;

def_token: (IDENT ACORCHETE (RANGO)+ CCORCHETE)+;

def_variables: PORCENTAJE ALLAVE (TIPO IDENT PUNTOYCOMA)+ PORCENTAJE CLLAVE;

regla:  regla1 regla2* regla3;
regla1: CALLIDENT (MAS|ASTERISCO)?;
regla2: APARENTESIS CALLIDENT (OR CALLIDENT)+ CPARENTESIS (MAS|ASTERISCO)?;
regla3: IDENT (INCREMENTO|DECREMENTO) PUNTOYCOMA;

def_reglas: PORCENTAJE PORCENTAJE (regla)+ PORCENTAJE PORCENTAJE;

funcion: (def_funcion def_cuerpo)+;
def_funcion: TIPO (IDENT|MAIN) APARENTESIS (VOID | (llamada_variable (COMA llamada_variable)*)) CPARENTESIS;
llamada_variable: TIPO (ASTERISCO)? IDENT (ACORCHETE CCORCHETE)?;
def_cuerpo: ALLAVE ((sentencia |retorno) PUNTOYCOMA)* CLLAVE;
retorno: RETURN (CADENA | NUMERO);
sentencia: (IDENT IGUAL (llamada_funcion | (NUMERO | CADENA))) | llamada_funcion;
llamada_funcion: IDENT APARENTESIS ((IDENT(ACORCHETE (NUMERO) CCORCHETE)? | NUMERO| CADENA) (COMA (IDENT(ACORCHETE (NUMERO) CCORCHETE)? | NUMERO| CADENA))*)? CPARENTESIS;